﻿using System;

namespace LAPI.Business.Gestores
{
    /// <summary>
    /// Clase que implementa funciones para gestionar operaciones sobre la entidad de base de datos 'Usuarios'
    /// </summary>
    public class GestorUsuarios
    {
        /// <summary>
        /// Logger de la clase
        /// </summary>
        private LAPI.Core.Logging.ILogger logger;

        /// <summary>
        /// Constructor
        /// </summary>
        public GestorUsuarios()
        {
            logger = LAPI.Core.Logging.LoggerFactory.CreateLogger(type: typeof(GestorUsuarios));
        }

        #region Getter
        /// <summary>
        /// Método para obtener un listado de todos los usuarios activos
        /// </summary>
        /// <returns>Una colección del modelo Usuario con todos los usuarios activos</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public System.Collections.Generic.List<LAPI.Data.Model.Usuario> ObtenerActivos()
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where activo = 1");

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }           
        }

        /// <summary>
        /// Método para obtener un listado de todos los usuarios administradores
        /// </summary>
        /// <param name="datosSesion">datos de la sesión del usuario autenticado</param>
        /// <param name="permisos">Permiso indicado</param>
        /// <returns>Una colección del modelo Usuario con todos los usuarios administradores</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        /// <seealso cref="Permisos"/>
        public System.Collections.Generic.List<LAPI.Data.Model.Usuario> ObtenerPorPermiso(DatosSesion datosSesion, LAPI.Business.Permisos permisos)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            if (permisos == Permisos.USUARIO)
                sql.Append(" where id_permisos = 1");
            if (permisos == Permisos.ADMINISTRADOR_DE_PISTAS)
                sql.Append(" where id_permisos = 2");
            if (permisos == Permisos.ADMINISTRADOR_LAPI)
                sql.Append(" where id_permisos = 3");

            sql.Append("   and id_usuario != " + datosSesion.getModelUsuario().IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para obtener un listado de todos los usuarios (activos y no activos)
        /// </summary>
        /// <param name="datosSesion">datos de la sesión del usuario autenticado</param>
        /// <returns>Una colección del modelo Usuario con todos los usuarios</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public System.Collections.Generic.List<LAPI.Data.Model.Usuario> ObtenerTodos(DatosSesion datosSesion)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where id_usuario != " + datosSesion.getModelUsuario().IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para obtener los datos de un usuario, sabiendo su identificador único
        /// </summary>
        /// <param name="IdUsuario">Int con el identificador único del usuario</param>
        /// <returns>modelo Usuario con los datos</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public LAPI.Data.Model.Usuario ObtenerPorId(Int32 IdUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where id_usuario = " + IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial(); 
                return result[0];
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para obtener los datos de usuarios administradores de un centro deportivo
        /// </summary>
        /// <param name="IdCentroDeportivoAdministrado">Int con el identificador único del centro deportivo</param>
        /// <returns>modelo Usuario con los datos</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public System.Collections.Generic.List<LAPI.Data.Model.Usuario> ObtenerPorCentroDeportivoAdministrado(Int32 IdCentroDeportivoAdministrado)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(", admincentro ");
            sql.Append("where id_centrodeportivo = " + IdCentroDeportivoAdministrado);
            sql.Append("  and admincentro.id_usuario = usuario.id_usuario");

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para obtener el centro deportivo administrado por un usuario
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del usuario</param>
        /// <returns>Int con el identificador único del centro deportivo</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public Int32 ObtenerCentroAdministrado(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Data.DataSet result;

            sql.Append("Select admincentro.id_centrodeportivo from admincentro");
            sql.Append(" where id_usuario = " + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Select(sql.ToString());
                oBBDD.CerrarParcial();
                return Convert.ToInt32(result.Tables[0].Rows[0][0].ToString());
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return -1;
            }
        }

        /// <summary>
        /// Método para obtener los datos de un usuario, sabiendo su nombre de usuario
        /// </summary>
        /// <param name="nombreUsuario">String con el nombre del usuario</param>
        /// <returns>modelo Usuario con los datos</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public LAPI.Data.Model.Usuario ObtenerPorNombreUsuario(String nombreUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where activo = 1 and usuario = '" + nombreUsuario + "'");

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                if (result.Count == 1)
                    return result[0];
                else
                    return null;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para obtener los datos de un usuario, sabiendo su email
        /// </summary>
        /// <param name="email">String con el email del usuario</param>
        /// <returns>modelo Usuario con los datos</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public LAPI.Data.Model.Usuario ObtenerPorEmail(String email)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where activo = 1 and email = '" + email + "'");

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                if (result.Count == 1)
                    return result[0];
                else
                    return null;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para filtrar una busqueda de Usuario por alguno de estos campos:
        /// <ul>
        /// <li>idUsuario</li>
        /// <li>Nombre/Apellido/Apellido2</li>
        /// <li>User</li>
        /// <li>Email</li>
        /// </ul>
        /// </summary>
        /// <param name="filtroBusqueda">Diccionario con el filtro de la búsqueda</param>
        /// <param name="datosSesion">datos de la sesión del usuario autenticado</param>
        /// <returns>Una colección del modelo con todos los usuarios</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        /// <seealso cref="DatosSesion"/>
        public System.Collections.Generic.List<LAPI.Data.Model.Usuario> ObtenerBusqueda(System.Collections.Hashtable filtroBusqueda, DatosSesion datosSesion)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where id_usuario != " + datosSesion.getModelUsuario().IdUsuario);

            //Añadimos filtros
            if (filtroBusqueda.ContainsKey("idusuario"))
                sql.Append(" and id_usuario like '%" + filtroBusqueda["idusuario"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("dni"))
                sql.Append(" and dni like '%" + filtroBusqueda["dni"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("email"))
                sql.Append(" and email like '%" + filtroBusqueda["email"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("nombre"))
            {
                sql.Append(" and (");
                sql.Append(" nombre like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" or apellido like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" or apellido2 like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" )");
            }

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para filtrar una busqueda de Usuario por alguno de estos campos:
        /// <ul>
        /// <li>idUsuario</li>
        /// <li>Nombre/Apellido/Apellido2</li>
        /// <li>User</li>
        /// <li>Email</li>
        /// </ul>
        /// Además, el usuario debe de tener un permiso indicado
        /// </summary>
        /// <param name="filtroBusqueda">Diccionario con el filtro de la búsqueda</param>
        /// <param name="permiso">Permiso indicado</param>
        /// <param name="datosSesion">datos de la sesión del usuario autenticado</param>
        /// <returns>Una colección del modelo con todos los usuarios</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        /// <seealso cref="DatosSesion"/>
        /// <seealso cref="Permisos"/>
        public System.Collections.Generic.List<LAPI.Data.Model.Usuario> ObtenerBusqueda(System.Collections.Hashtable filtroBusqueda, LAPI.Business.Permisos permiso, DatosSesion datosSesion)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where id_usuario != " + datosSesion.getModelUsuario().IdUsuario);

            if (permiso == Permisos.USUARIO)
                sql.Append("   and id_permisos = 1");
            if (permiso == Permisos.ADMINISTRADOR_DE_PISTAS)
                sql.Append("   and id_permisos = 2");
            if (permiso == Permisos.ADMINISTRADOR_LAPI)
                sql.Append("   and id_permisos = 3");
         
            //Añadimos filtros
            if (filtroBusqueda.ContainsKey("idusuario"))
                sql.Append(" and id_usuario like '%" + filtroBusqueda["idusuario"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("dni"))
                sql.Append(" and dni like '%" + filtroBusqueda["dni"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("email"))
                sql.Append(" and email like '%" + filtroBusqueda["email"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("nombre"))
            {
                sql.Append(" and (");
                sql.Append(" nombre like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" or apellido like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" or apellido2 like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" )");
            }

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para filtrar una busqueda de Usuario administrador de un centro deportivo por alguno de estos campos:
        /// <ul>
        /// <li>idUsuario</li>
        /// <li>Nombre/Apellido/Apellido2</li>
        /// <li>User</li>
        /// <li>Email</li>
        /// </ul>
        /// Además, el usuario debe de tener un permiso indicado
        /// </summary>
        /// <param name="filtroBusqueda">Diccionario con el filtro de la búsqueda</param>
        /// <param name="idCentroDeportivo">Identificador único del centro deportivo</param>
        /// <returns>Una colección del modelo con todos los usuarios</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public System.Collections.Generic.List<LAPI.Data.Model.Usuario> ObtenerBusqueda(System.Collections.Hashtable filtroBusqueda, Int32 idCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table + ", admincentro ");
            sql.Append(" where admincentro.id_centrodeportivo = " + idCentroDeportivo);
            sql.Append("   and admincentro.id_usuario = usuario.id_usuario ");
            //Añadimos filtros
            if (filtroBusqueda.ContainsKey("idusuario"))
                sql.Append(" and admincentro.id_usuario like '%" + filtroBusqueda["idusuario"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("dni"))
                sql.Append(" and dni like '%" + filtroBusqueda["dni"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("email"))
                sql.Append(" and email like '%" + filtroBusqueda["email"].ToString().Replace('*', '%') + "%'");
            if (filtroBusqueda.ContainsKey("nombre"))
            {
                sql.Append(" and (");
                sql.Append(" nombre like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" or apellido like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" or apellido2 like '%" + filtroBusqueda["nombre"].ToString().Replace('*', '%') + "%'");
                sql.Append(" )");
            }

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }
        #endregion

        #region Comprobaciones 

        /// <summary>
        /// Método para validar si las credenciales (usuario/contraseña) corresponden a algún usuario
        /// </summary>
        /// <param name="usuario">String con el valor de nombre de usuario</param>
        /// <param name="contrasena">String con el valor de contraseña de usuario</param>
        /// <returns>modelo Usuario con los datos del usuario autenticado, o null si no hay ninguno que 
        /// corresponda a esas credenciales</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public LAPI.Data.Model.Usuario ValidarCredencialesUsuario(String usuario, String contrasena)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.Usuario.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where activo = 1");
            sql.Append(" and Usuario = '" + usuario);
            sql.Append("' and Password = '" + contrasena);
            sql.Append("'");

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.Usuario.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                if (result.Count > 0)
                    return result[0];
                else
                    return null;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }  
        }

        /// <summary>
        /// Método para comprobar si existe algún usuario con el email o nombre de usuario indicado
        /// </summary>
        /// <param name="datosUsuario">Modelo con datos de usuario (contiene mínimo email y nombre de usuario)</param>
        /// <returns>False si existe un usuario con ese email o nombre de usuario. True si no ocurre.</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public Boolean ComprobarUserYEmail(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Select 1");         
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where activo = 1");
            sql.Append(" and (");
            sql.Append(" usuario = '" + datosUsuario.User);
            sql.Append("' or email = '" + datosUsuario.Email);
            sql.Append("' )");

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Select(sql.ToString()).Tables[0].Rows.Count;
                oBBDD.CerrarParcial(); 
                return result > 0 ? false : true;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return false;
            }
        }

        /// <summary>
        /// Método para comprobar si una direccion de email, pertenece o no a un usuario registrado de LAPI.
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos de usuario.
        /// <p>
        /// Es obligatorio que datosUsuario tenga valor para 'Email'. 
        /// </p>
        /// <p>
        /// Es opcional que datosUsuario tenga valor para 'IdUsuario'
        /// </p>
        /// </param>
        /// <returns>True si no existe. False si existe</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public Boolean ComprobarEmail(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Select 1");
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where activo = 1");
            sql.Append(" and email = '" + datosUsuario.Email + "'");

            if (datosUsuario.IdUsuario != 0)
                sql.Append(" and id_usuario != " + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Select(sql.ToString()).Tables[0].Rows.Count;
                oBBDD.CerrarParcial();
                return result > 0 ? false : true;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return false;
            }
        }
        
        /// <summary>
        /// Método para comprobar si existe algún usuario con el dni indicado
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos de usuario.
        /// <p>
        /// Es obligatorio que datosUsuario tenga valor para 'DNI'. 
        /// </p>
        /// <p>
        /// Es opcional que datosUsuario tenga valor para 'IdUsuario'
        /// </p>
        /// </param>
        /// <returns>True si no existe. False si existe</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public Boolean ComprobarDNI(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Select 1");
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where activo = 1");
            sql.Append(" and  dni = '" + datosUsuario.DNI + "'");

            if (datosUsuario.IdUsuario != 0)
                sql.Append(" and id_usuario != " + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Select(sql.ToString()).Tables[0].Rows.Count;
                oBBDD.CerrarParcial();
                return result > 0 ? false : true;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return false;
            }
        }

        /// <summary>
        /// Método para comprobar si una contraseña corresponde a un usuario indicado
        /// </summary>
        /// <param name="datosUsuario">Modelo con datos de usuario (contiene mínimo identificador de usuario y contraseña)</param>
        /// <returns>True si corresponde. False en cualquier otra situación</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public Boolean ComprobarContrasena(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Select 1");
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where activo = 1");
            sql.Append(" and  password = '" + datosUsuario.Password + "'");
            sql.Append(" and id_usuario = " + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Select(sql.ToString()).Tables[0].Rows.Count;
                oBBDD.CerrarParcial();
                return result > 0 ? true : false;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return false;
            }
        }

        /// <summary>
        /// Método para comprobar si un usuario es administrador de algún centro deportivo
        /// </summary>
        /// <param name="datosUsuario">Modelo con datos de usuario (contiene mínimo email y nombre de usuario)</param>
        /// <returns>False si el usuario administra algún centro deportivo. True si no ocurre.</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public Boolean ComprobarAdministradorCentroDeportivo(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Select 1");
            sql.Append(" from ADMINCENTRO");
            sql.Append(" where id_usuario =" + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Select(sql.ToString()).Tables[0].Rows.Count;
                oBBDD.CerrarParcial();
                return result > 0 ? false : true;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return false;
            }
        }

#endregion

        #region insert

        /// <summary>
        /// Método para insertar un nuevo usuario en la base de datos
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del usuario a insertar (previamente validados)</param>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public void Insertar(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Insert into ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" ( ");
            sql.Append(datosUsuario.ToInsertColumns());
            sql.Append(" ) values ( ");
            sql.Append(datosUsuario.ToInsertValues());
            sql.Append(" ) ");            

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Insert(sql.ToString());               
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha insertado el registro: " +datosUsuario);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha insertado el registro: " + datosUsuario);
            }           
        }

        /// <summary>
        /// Método para insertar permiso administrador a un usuario
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del usuario</param>
        /// <param name="idCentroDeportivo">Identificador único del centro deportivo</param>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public void InsertarAdminCentro(LAPI.Data.Model.Usuario datosUsuario, Int32 idCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Insert into admincentro (");
            sql.Append("id_usuario, id_centrodeportivo");
            sql.Append(") values (");
            sql.Append( datosUsuario.IdUsuario + "," + idCentroDeportivo);
            sql.Append(")");

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Insert(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha insertado el registro: " + datosUsuario);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha insertado el registro: " + datosUsuario);
            }
        }

        #endregion

        #region update

        /// <summary>
        /// Método para actualizar los datos 'cambiantes' del usuario.
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos actualizados del usuario</param>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public void Actualizar(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Update ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" set ");
            sql.Append(datosUsuario.ToUpdateDatosUsuario());
            sql.Append(" where activo = 1");
            sql.Append("   and id_usuario =" + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Update(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha actualizado el registro: " + datosUsuario);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha actualizado el registro: " + datosUsuario);
            }
        }

        /// <summary>
        /// Método para actualizar la contraseña del usuario.
        /// </summary>
        /// <param name="datosUsuario">Modelo con la contraseña actualizada del usuario</param>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public void ActualizarContrasena(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Update ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" set ");
            sql.Append(datosUsuario.ToUpdatePasswordUsuario());
            sql.Append(" where activo = 1");
            sql.Append("   and id_usuario =" + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Update(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha actualizado el registro: " + datosUsuario);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha actualizado el registro: " + datosUsuario);
            }
        }

        /// <summary>
        /// Método para actualizar el estado del Usuario
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del Usuario</param>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public void ActualizarEstado(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Update ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" set ");
            sql.Append(datosUsuario.ToUpdateEstado());
            sql.Append(" where id_usuario =" + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Update(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha actualizado el registro: " + datosUsuario);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha actualizado el registro: " + datosUsuario);
            }
        }

        /// <summary>
        /// Método para actualizar el permiso del Usuario
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del Usuario</param>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public void ActualizarPermiso(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Update ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" set ");
            sql.Append(datosUsuario.ToUpdatePermiso());
            sql.Append(" where id_usuario =" + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Update(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha actualizado el registro: " + datosUsuario);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha actualizado el registro: " + datosUsuario);
            }
        }

        #endregion

        #region delete

        /// <summary>
        /// Método para eliminar un Usuario
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del Usuario</param>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public void Eliminar(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Delete from ");
            sql.Append(LAPI.Data.Model.Usuario.Table);
            sql.Append(" where id_usuario =" + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Delete(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha eliminado el registro: " + datosUsuario);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha eliminado el registro: " + datosUsuario);
            }
        }

        /// <summary>
        /// Método para eliminar permiso administrador de un centro a un Usuario
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del Usuario</param>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorBBDD"/>
        public void EliminarAdminCentro(LAPI.Data.Model.Usuario datosUsuario)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Delete from admincentro");
            sql.Append(" where id_usuario =" + datosUsuario.IdUsuario);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Delete(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha eliminado el registro: " + datosUsuario);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha eliminado el registro: " + datosUsuario);
            }
        }
        #endregion
    }
}
